/**
 * Classe para rápida execução e e teste dos analizadores sintático
 * e semântico para uma implementação reduzida da linguagem Modula-2.
 * 
 * @author Rodolpho Uchôa
 * @author Rubens Van Dingenen
 * @author Saulo Toledo
 */
public class Main {

	/**
	 * Método chamado quando o aplicativo é executado.
	 * Espera que o conjunto de parâmetros contenham caminhos válidos de arquivos
	 * para a execução dos analizadores.
	 *  
	 * @param args Argumentos de linha de comando.
	 */
	public static void main(String[] args) {
		for (int i = 0; i < args.length; i++) {

			System.out.println("[ Análise léxica e sintática do arquivo no. "+ (i+1) +" ]\n");
			
			// Mantido para testes com o analizador léxico separadamente:
			//runLexicalAnalyzer( args[i]);
			//System.out.println("\n\n");
			
			// A análise léxica ocorre enquanto a sintática e a semântica estão rodando:
			//runSyntacticAnalyzer(args[i]);

			//System.out.println("\n[ Análise (léxica e) semântica do arquivo no. "+ (i+1) +" ]\n");
			
			// Para fins de apresentação do projeto, a análise semântica ocorre separadamente:
			runSemanticAnalyzer(args[i]);
			
			System.out.println("\n--------------------------------------------------------\n");
		}
	}
	
	/**
	 * Executa o analizador léxico em um arquivo de caminho informado.
	 * 
	 * @param filepath O caminho do arquivo a verificar.
	 */
	private static void runLexicalAnalyzer(String filepath) {
		LexicalAnalyzer scanner = null;
		try {
			scanner = new LexicalAnalyzer( new java.io.FileReader(filepath) );
			while ( !scanner.scannerIsAtEof() )
				scanner.next_token();
		}
		catch (java.io.FileNotFoundException e) {
			System.out.println("Arquivo não encontrado: \""+ filepath +"\"");
		}
		catch (java.io.IOException e) {
			System.out.println("Erro de entrada/saída ao escanear arquivo \""+ filepath +"\"");
			System.out.println(e);
		}
		catch (Exception e) {
			System.err.println("Excessão inesperada: " + e.getMessage());
			//e.printStackTrace();
		}
	}
	
	/**
	 * Executa o analizador sintático (e o léxico internamente)
	 * em um arquivo de caminho informado
	 * 
	 * @param filepath O caminho do arquivo a verificar.
	 */
	private static void runSyntacticAnalyzer(String filepath) {
		
		try {
			LexicalAnalyzer scanner = new LexicalAnalyzer( new java.io.FileReader(filepath) );
			SyntacticAnalyzer sa = new SyntacticAnalyzer( scanner );
			sa.parse();
		}
		catch (Exception e) {
			System.err.println("Excessão inesperada: " + e.getMessage());
			//e.printStackTrace();
		}
	}
	
	/**
	 * Executa o analizador sintático (e o léxico internamente)
	 * em um arquivo de caminho informado
	 * 
	 * @param filepath O caminho do arquivo a verificar.
	 */
	private static void runSemanticAnalyzer(String filepath) {
		
		try {
			LexicalAnalyzer scanner = new LexicalAnalyzer( new java.io.FileReader(filepath) );
			SemanticAnalyzer sa = new SemanticAnalyzer( scanner );
			sa.parse();
		}
		catch (Exception e) {
			System.err.println("Excessão inesperada: " + e.getMessage());
			//e.printStackTrace();
		}
	}
}